﻿    using System;  
    using System.Collections.Generic;  
    using System.Linq;  
    using System.Text;  
    using System.Data.SqlClient;  
    using System.Data;  
    using System.Reflection;  
    using System.Configuration;
    using System.IO;
    using Newtonsoft.Json;

namespace myAutoExcuteJobService.Tools
{
   public static class Covert
    {
      
      
            /// <summary>  
            /// DataSetToList  
            /// </summary>  
            /// <typeparam name="T">转换类型</typeparam>  
            /// <param name="ds">一个DataSet实例，也就是数据源</param>  
            /// <param name="tableIndext">DataSet容器里table的下标，只有用于取得哪个table，也就是需要转换表的索引</param>  
            /// <returns></returns>  
            public static List<T> DataSetToList<T>(DataSet ds, int tableIndext)  
            {  
                //确认参数有效  
                if (ds == null || ds.Tables.Count <= 0 || tableIndext < 0)  
                {  
                    return null;  
                }  
                DataTable dt = ds.Tables[tableIndext]; //取得DataSet里的一个下标为tableIndext的表，然后赋给dt  
      
                IList<T> list = new List<T>();  //实例化一个list  
                // 在这里写 获取T类型的所有公有属性。 注意这里仅仅是获取T类型的公有属性，不是公有方法，也不是公有字段，当然也不是私有属性                                                 
                PropertyInfo[] tMembersAll = typeof(T).GetProperties();  
      
                for (int i = 0; i < dt.Rows.Count; i++)  
                {  
                    //创建泛型对象。为什么这里要创建一个泛型对象呢？是因为目前我不确定泛型的类型。  
                    T t = Activator.CreateInstance<T>();  
      
      
                    //获取t对象类型的所有公有属性。但是我不建议吧这条语句写在for循环里，因为没循环一次就要获取一次，占用资源，所以建议写在外面  
                    //PropertyInfo[] tMembersAll = t.GetType().GetProperties();  
      
      
                    for (int j = 0; j < dt.Columns.Count; j++)   
                    {  
                        //遍历tMembersAll  
                        foreach (PropertyInfo tMember in tMembersAll)  
                        {  
                            //取dt表中j列的名字，并把名字转换成大写的字母。整条代码的意思是：如果列名和属性名称相同时赋值  
                            if (dt.Columns[j].ColumnName.ToUpper().Equals(tMember.Name.ToUpper()))  
                            {  
                                //dt.Rows[i][j]表示取dt表里的第i行的第j列；DBNull是指数据库中当一个字段没有被设置值的时候的值，相当于数据库中的“空值”。   
                                if (dt.Rows[i][j] != DBNull.Value)  
                                {  
                                    //SetValue是指：将指定属性设置为指定值。 tMember是T泛型对象t的一个公有成员，整条代码的意思就是：将dt.Rows[i][j]赋值给t对象的tMember成员,参数详情请参照http://msdn.microsoft.com/zh-cn/library/3z2t396t(v=vs.100).aspx/html  
      
                                    tMember.SetValue(t, dt.Rows[i][j], null);  
      
      
                                }  
                                else  
                                {  
                                    tMember.SetValue(t, null, null);  
                                }  
                                break;//注意这里的break是写在if语句里面的，意思就是说如果列名和属性名称相同并且已经赋值了，那么我就跳出foreach循环，进行j+1的下次循环  
                            }  
                        }  
                    }  
      
                    list.Add(t);  
                }  
                return list.ToList();  
      
            }  
        
      
      
 
    }


   /// <summary>
   /// Json帮助类
   /// </summary>
   public static class JsonHelper
   {
       /// <summary>
       /// 将对象序列化为JSON格式
       /// </summary>
       /// <param name="o">对象</param>
       /// <returns>json字符串</returns>
       public static string SerializeObject(object o)
       {
           string json = JsonConvert.SerializeObject(o);
           return json;
       }

       /// <summary>
       /// 解析JSON字符串生成对象实体
       /// </summary>
       /// <typeparam name="T">对象类型</typeparam>
       /// <param name="json">json字符串(eg.{"ID":"112","Name":"石子儿"})</param>
       /// <returns>对象实体</returns>
       public static T DeserializeJsonToObject<T>(string json) where T : class
       {
           JsonSerializer serializer = new JsonSerializer();
           StringReader sr = new StringReader(json);
           object o = serializer.Deserialize(new JsonTextReader(sr), typeof(T));
           T t = o as T;
           return t;
       }

       /// <summary>
       /// 解析JSON数组生成对象实体集合
       /// </summary>
       /// <typeparam name="T">对象类型</typeparam>
       /// <param name="json">json数组字符串(eg.[{"ID":"112","Name":"石子儿"}])</param>
       /// <returns>对象实体集合</returns>
       public static List<T> DeserializeJsonToList<T>(string json) where T : class
       {
           JsonSerializer serializer = new JsonSerializer();
           StringReader sr = new StringReader(json);
           object o = serializer.Deserialize(new JsonTextReader(sr), typeof(List<T>));
           List<T> list = o as List<T>;
           return list;
       }

       /// <summary>
       /// 反序列化JSON到给定的匿名对象.
       /// </summary>
       /// <typeparam name="T">匿名对象类型</typeparam>
       /// <param name="json">json字符串</param>
       /// <param name="anonymousTypeObject">匿名对象</param>
       /// <returns>匿名对象</returns>
       public static T DeserializeAnonymousType<T>(string json, T anonymousTypeObject)
       {
           T t = JsonConvert.DeserializeAnonymousType(json, anonymousTypeObject);
           return t;
       }
   }
}
